科学的?説明

Pendulumaniaでは、振り子の動きを、物理法則に基づいてかなりリアルにシミュレートしています。

必要ないという人がほとんどでしょうけど、ときどき質問があるので、Pendulumaniaの中で使われている物理定数・原理などを書いておきます。定数はテストプレイ中に、最適なゲームバランスになるようにいろいろ調整したので、切りの悪い数字ですが許してください(^^;

これを読むことでPendulumaniaの得点がアップすることは、まずないと思いますので、気になる人向けです。

※2000年現在、下で説明していることは全て高校力学(一部中学)の範囲内です。

単位

説明の都合上、長さの単位はpixel、時間の単位はtick(=0.025秒)、質量の単位はkgとします。


定数

壁とボールとの衝突係数
0.7です。ボールが画面上下左右の壁(&天井、床)に跳ね返ると、ボールの速度は、跳ね返る前の速度の0.7倍になります。
重力加速度
0.2[pixel/tick2]です。1tickごとに、重力方向にボールのスピードがこの値だけ加算されます。
※ついでにボールを破壊したときの破片にも同じ重力が加わります
ゴムの弾性定数
0.008[kg/tick2]です。ゴムの伸びにこの比例定数をかけたものが、ボールがゴムから受ける力になります(フックの法則)。この力÷ボールの質量が、ボールの加速度になります(ニュートンの力学基本法則…運動方程式)
※ボールの質量はボールの半径をもとに自動計算しています
ゴムの自然長
0.25[pixel]です。これは、ゴムに全く力が加わっていないときのゴムの長さのことであり、いわゆるゴムの『伸び』は、「ゴムの長さ-ゴムの自然長」になります。ゴムの長さが、ゴムの自然長よりも短い場合は、ゴムはボールに力を及ぼしません。(その結果重力だけが働き、ゴムは放物線を描きます)
なお、緑のターゲットではゴムの自然長は増加しません。緑のターゲットを破壊して増加するのはゴムの伸びの最大値です。
※ゴムの長さが自然長よりも短い、と書きましたが、実際はそんなことはないですね(^^; ゴムがたるんでいる状況だと考えてください。

計算

振り子の物理的シミュレートは、40分の1秒(=1tick)単位で行っています。

まず、重力とゴムからの力によって、ボールに加わる加速度を計算します。

ボールの加速度 = 重力加速度定数 + ゴムからの力による加速度

ゴムからの力による加速度は、ゴムの伸び x ゴムの弾性定数 ÷ ボールの質量で求まります。

1tickは十分短いので、この間ボールの加速度は一定であると近似して、次にボールの速度を算出します。

ボールの速度 = 前の瞬間のボールの速度[pixel/tick] + 加速度[pixel/tick2] X 1[tick]

今度は、1tickは十分短いので、この間ボールの速度は一定であると近似して、ボールの位置を算出します。

ボールの位置 = 前の瞬間のボールの位置 + ボールの速度 X 1

壁に衝突したときの計算は、これとは別に行っています。なお、加速度・速度・位置は全てベクトル量(x方向とy方向がある)です。計算上は水平方向と垂直方向を独立にやればOKです。

※速度と位置を求めるところで出てくる、X1ですが、1tickごとの計算なので1になります。「移動距離=速度X時間」ですが、速度の単位が「1tickごとの移動距離」になるように取ってあるので、X1となり、計算が楽になります(実質、ただの足し算になる)。速度の方も一緒です。


注意

Pendulumaniaでは、ゲーム中のリアルな振り子の動きを、基本的には物理法則に厳密に基づいて再現しています。が、一部近似計算も行っていますので、以下の点に注意してください。


物理定数を変更する

さて、ここまで説明を読んだ人なら、これらの物理定数をいじったら、ボールがどんな動きをするのか、気になることでしょう。というわけで、Pendulumaniaでは、今まで説明した物理定数のうちいくつかを、実験的に変更してみる機能があります。

ただし、変更することによってゲームのバランスが崩れてしまいますので、これらを変更した状態では、「ゲームの録画」「ゲームの再生」「ハイスコアの記録」は一切行えません。また、結果表示画面でも、ランクは表示されません。というわけで、既にゲームではなくなってしまいますので、試して満足したら、さっさと元に戻してください(^^;

では、変更の方法を説明します。

PMania.iniという設定ファイル(歯車のアイコンが付いているものです)をメモ帳で開いてください。下のような個所があると思います。

[ConstantSetting]
Gravity=1
CollisionConstant=1
NaturalLength=1
RubberConstant=1
BallMass=1

下の5行の行末にある、5つの「1」の数字を変更することで、ゲーム中の物理定数を実数倍することができます。(数字は半角文字で入力しましょう)

例えば、重力を2倍にしたらどうなるだろう、と思った場合は、Gravity=2としてこのPMania.iniファイルを保存して、ゲームを起動してみましょう。重力2倍の状況でゲームがプレイできます。(点数は記録されません) 他も全部同様です。

ただし、あんまり大きい数字(10とか100とか)は絶対に入力しないでください。プログラムがエラーを起こしたり、変な動きをするようになっても知りません。また、あまり通常の設定から離れた場合には正しいシミュレートは行えません。妙な設定にしてゲームが終わらなくなったら、ESCキーを押してみてください。

Gravity以外は、マイナスの値も指定しないでください。(指定してあったら自動的にその数字の絶対値を使用します)

Gravity(重力)
これは重力加速度を変更します。0にすれば無重力、マイナスの値を指定すると重力が反転します(^^;
CollisionConstant(壁との衝突係数)
壁とボールの跳ね返り具合を変更します。0にするとまったく跳ね返りません。大きくしすぎると、衝突するたびにスピードアップしてしまうという恐ろしい事態になります。
NaturalLength(ゴムの自然長)
ゴムの自然長(まったく伸びていないときの長さ)です。あまり大きくすると、どんなに振り回してもゴムは伸びていない、というような状況になってしまうため、振り子をまったく操作できなくなってしまいます。
RubberConstant(ゴムの弾性定数)
ゴムの弾性定数を変更します。大きくすると、いわゆる「強力なゴム」になります。小さくすると、振り子を動かせなくなってしまいます。
BallMass(ボールの質量)
そのまんまです。ボールの質量を変更します。0にはしないでください。

これによって物理定数を変更できますが、「ボールのスピードは一定以上に上がらない仕様にしてある」ので、その点は注意してくださいね。例えどんなに軽いボールや強力なゴムを作っても、スピードはある程度以上には上がりません。